package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
	"net/http"
)

var (
	DB *gorm.DB
)

type Todo struct {
	ID     int    `json:"id"`
	Title  string `json:"title"`
	Status bool   `json:"status"`
}

func initMySQL() (err error) {
	dsn := "root:root@tcp(localhost:3306)/bubble"
	DB, err = gorm.Open("mysql", dsn)
	fmt.Println("err ", err)
	if err != nil {
		return err
	}
	// 判断是否连接成功
	return DB.DB().Ping()
}

func main() {

	// 连接数据库
	err := initMySQL()
	if err != nil {
		panic("连接数据库失败")
	}
	defer DB.Close()
	// 模型绑定
	DB.AutoMigrate(&Todo{})

	r := gin.Default()
	// 告诉gin静态文件资源去哪里找
	r.Static("/static", "static")
	// 告诉gin去哪里找模板文件
	r.LoadHTMLGlob("templates/*")
	r.GET("/", func(context *gin.Context) {
		context.HTML(http.StatusOK, "index.html", nil)
	})

	v1Group := r.Group("v1")
	{
		v1Group.POST("/todo", func(context *gin.Context) {
			var todo Todo
			context.BindJSON(&todo)
			if err = DB.Create(&todo).Error; err != nil {
				context.JSON(http.StatusOK, gin.H{"msg": err.Error()})
			} else {
				context.JSON(http.StatusOK, todo)
			}
		})

		// 查看所有数据
		v1Group.GET("/todo", func(context *gin.Context) {
			var todoList []Todo
			err2 := DB.Find(&todoList).Error

			if err2 != nil {
				context.JSON(http.StatusOK, gin.H{"error": err2.Error()})
			} else {
				context.JSON(http.StatusOK, todoList)
			}
		})

		// 查看指定id的数据
		v1Group.GET("/todo/:id", func(context *gin.Context) {

		})

		// 删除数据
		v1Group.DELETE("/todo/:id", func(context *gin.Context) {
			id, ok := context.Params.Get("id")
			if !ok {
				context.JSON(http.StatusOK, gin.H{"error": "无效的id"})
				return
			}

			err2 := DB.Where("id=?", id).Delete(Todo{}).Error
			if err2 != nil {
				context.JSON(http.StatusOK, gin.H{"error": err2.Error()})
			} else {
				context.JSON(http.StatusOK, gin.H{"msg": "删除成功"})
			}
		})

		// 修改数据
		v1Group.PUT("/todo/:id", func(c *gin.Context) {
			id, ok := c.Params.Get("id")
			if !ok {
				c.JSON(http.StatusOK, gin.H{"error": "无效的id"})
				return
			}
			var todo Todo
			if err = DB.Where("id=?", id).First(&todo).Error; err != nil {
				c.JSON(http.StatusOK, gin.H{"error": err.Error()})
				return
			}
			err := c.BindJSON(&todo)
			if err != nil {
				fmt.Println("err ", err.Error())
				c.JSON(http.StatusOK, gin.H{"error": err.Error()})
				return
			}
			if err = DB.Save(&todo).Error; err != nil {
				c.JSON(http.StatusOK, gin.H{"error": err.Error()})
			} else {
				c.JSON(http.StatusOK, todo)
			}
		})
	}

	r.Run()
}
